

<!DOCTYPE html>
<html lang="en" color-mode=light>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Cocoapods的组件化私有库 - 习武的个人博客</title>
  <meta name="apple-mobile-web-app-capable" content="yes" />
  <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
  <meta name="google" content="notranslate" />
  
  <meta name="description" content="引言随着项目的越来越臃肿，那么需要对项目进行拆分进行模...">
  <meta name="author" content="习武">
  <link rel="icon" href="/xiwu_see/images/icons/favicon-16x16.png" type="image/png" sizes="16x16">
  <link rel="icon" href="/xiwu_see/images/icons/favicon-32x32.png" type="image/png" sizes="32x32">
  <link rel="apple-touch-icon" href="/xiwu_see/images/icons/apple-touch-icon.png" sizes="180x180">
  <meta rel="mask-icon" href="/xiwu_see/images/icons/stun-logo.svg" color="#333333">
  
    <meta rel="msapplication-TileImage" content="/xiwu_see/images/icons/favicon-144x144.jpeg">
    <meta rel="msapplication-TileColor" content="#000000">
  

  
<link rel="stylesheet" href="/xiwu_see/css/style.css">


  
    
<link rel="stylesheet" href="//at.alicdn.com/t/font_1445822_s6x2xcokxrl.css">

  

  
    
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/fancybox/3.5.7/jquery.fancybox.min.css">

  

  
    
      
        
        
<link rel="stylesheet" href="https://cdn.bootcss.com/highlight.js/9.18.1/styles/xcode.min.css" name="highlight-style" mode="light">

      
        
        
<link rel="stylesheet" href="https://cdn.bootcss.com/highlight.js/9.18.1/styles/solarized-dark.min.css" name="highlight-style" mode="dark">

      
  

  <script>
    var CONFIG = window.CONFIG || {};
    var ZHAOO = window.ZHAOO || {};
    CONFIG = {
      isHome: false,
      fancybox: true,
      pjax: false,
      lazyload: {
        enable: true,
        only_post: 'false',
        loading: '/xiwu_see/images/theme/loading.gif'
      },
      donate: {
        enable: false,
        alipay: 'https://pic.izhaoo.com/alipay.jpg',
        wechat: 'https://pic.izhaoo.com/wechat.jpg'
      },
      galleries: {
        enable: true
      },
      fab: {
        enable: true,
        always_show: false
      },
      carrier: {
        enable: true
      },
      daovoice: {
        enable: false
      },
      preview: {
        background: {
          default: '/xiwu_see/images/theme/welcome-image.jpg',
          api: ''
        },
        motto: {
          default: '我在开了灯的床头下，想问问自己的心啊。',
          api: 'https://v2.jinrishici.com/one.json',
          data_contents: '["data","content"]'
        },
      },
      qrcode: {
        enable: false,
        type: 'url',
        image: 'https://pic.izhaoo.com/weapp-code.jpg',
      },
      toc: {
        enable: true
      },
      scrollbar: {
        model: 'simple'
      },
      notification: {
        enable: false,
        delay: 4500,
        list: '',
        page_white_list: '',
        page_black_list: ''
      }
    }
  </script>

  

  

<meta name="generator" content="Hexo 5.3.0"></head>

<body class="lock-screen">
  <div class="loading"></div>
  


  <nav class="navbar">
    <div class="left">
      
      
        <i class="iconfont iconmoono" id="color-toggle" color-toggle="light"></i>
      
    </div>
    <div class="center">Cocoapods的组件化私有库</div>
    <div class="right">
      <i class="iconfont iconmenu j-navbar-menu"></i>
    </div>
    
  </nav>

  

<nav class="menu">
  <div class="menu-wrap">
    <div class="menu-close">
      <i class="iconfont iconbaseline-close-px"></i>
    </div>
    <ul class="menu-content"><li class="menu-item">
        <a href="/xiwu_see/ " class="underline "> 首页</a>
      </li><li class="menu-item">
        <a href="/xiwu_see/archives/ " class="underline "> 归档</a>
      </li><li class="menu-item">
        <a href="/xiwu_see/tags/ " class="underline "> 标签</a>
      </li><li class="menu-item">
        <a href="/xiwu_see/categories/ " class="underline "> 分类</a>
      </li><li class="menu-item">
        <a href="/xiwu_see/about/ " class="underline "> 关于</a>
      </li></ul>
    
      <div class="menu-copyright"><p>Powered by <a target="_blank" href="https://hexo.io">习武</a>  |  Theme - <a target="_blank" href="https://xiwu123.gitee.io/xiwu_see">习武的个人博客</a></p></div>
    
  </div>
</nav>
  <main id="main">
  <div class="article-wrap">
    <div class="row container">
      <div class="col-xl-3"></div>
      <div class="col-xl-6"><article class="article">
  <div class="wrap">
    <section class="head">
  <img   class="lazyload" data-original="/xiwu_see/images/theme/theme-iOS-10.jpeg" src=""  draggable="false">
  <div class="head-mask">
    <h1 class="head-title">Cocoapods的组件化私有库</h1>
    <div class="head-info">
      <span class="post-info-item"><i class="iconfont iconcalendar"></i>July 05, 2019</span>
      
      <span class="post-info-item"><i class="iconfont iconfont-size"></i>6911</span>
    </div>
  </div>
</section>
    <section class="main">
      <section class="content">
        <h3 id="引言"><a href="#引言" class="headerlink" title="引言"></a>引言</h3><p>随着项目的越来越臃肿，那么需要对项目进行拆分进行模块化设置，而模块化则需要先把公共的部分都提取出来，构建成组件，做到一份组件各个模块共用，但是还需要做到可用可取消，这里就用到了Cocoapods的库导入机制，也是项目模块化的基础—组件化，所以需要做Cocoapods的组件化私有库。</p>
<hr>
<h3 id="目录"><a href="#目录" class="headerlink" title="目录"></a>目录</h3><ul>
<li>1.私有spec center repository的创建</li>
<li>2.私有库创建并将组件Spec 索引发布到私有center repository</li>
<li>3.私有库的pod引入</li>
<li>4.私有库的版本升级</li>
<li>5.私有库的源码与二进制码的切换</li>
</ul>
<hr>
<h3 id="私有spec-center-repository的创建"><a href="#私有spec-center-repository的创建" class="headerlink" title="私有spec center repository的创建"></a>私有spec center repository的创建</h3><h4 id="本地创建私有仓库的spec索引"><a href="#本地创建私有仓库的spec索引" class="headerlink" title="本地创建私有仓库的spec索引"></a>本地创建私有仓库的spec索引</h4><p>我们创建spec repository是基于gitlab的,我们在github上创建一个空的仓库，命名为publicSpec，这个仓库是用来存放我们自己所有的私有库的spec文件，就如同官方的<a target="_blank" rel="noopener" href="https://github.com/CocoaPods/Specs">https://github.com/CocoaPods/Specs</a>是用来存放所有官方的specs文件一样。<br>现在gitlab上创建一个名为publicSpec的仓库,然后终端执行:</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs javascript">pod repo add RGPublicSpec https:<span class="hljs-comment">//git.rograndec.com/publicModule/publicSpec.git</span><br></code></pre></td></tr></table></figure>
<p>注意：上面的命令的解释如下：</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs javascript">pod repo add repo_name source_url<br></code></pre></td></tr></table></figure>
<blockquote>
<p>其中的 repo_name 是我们要添加的私有repo的名称（这里我们待会填的是: RGPublicSpec），后面是仓库的 gitlab 地址。这里做的其实是创建的工作，也就是在~/.cocoapods/repos目录下添加了一个以你的私有repo为名的文件夹，但是并没有添加spec文件。</p>
</blockquote>
<p>然后你可以到~/.cocoapods/repo文件中去看是否有RGPublicSpec文件。如果有那么我们已经在本地得到我们自己的私有仓库 RGPublicSpec ，这是一个空的仓库,也是接下来需要用到的私有中央仓库。</p>
<h4 id="clone仓库到本地"><a href="#clone仓库到本地" class="headerlink" title="clone仓库到本地"></a>clone仓库到本地</h4><p>将仓库 clone 到本地，这里有多种操作方式，可以选择你喜欢的一种，这边选择使用命令行。首先需要切换到你想在本地存储的目录，然后再 clone ，在用户的根目录上：</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs javascript">cd ~<br>git clone https:<span class="hljs-comment">//git.rograndec.com/publicModule/publicSpec.git</span><br></code></pre></td></tr></table></figure>
<p>完成后，我们进入到 ~/publicSpec 目录,这时候你看到是LICENSE和README.md文件，这里还有一个隐藏的 .git 文件，后续我们的所有文件都在这个目录下进行。</p>
<p>README.md</p>
<blockquote>
<p>使用 github 的人应该都熟悉这个文件，它使一个成功的 github 仓库必不可少的一部分，使用 markdown 对仓库进行详细说明。</p>
</blockquote>
<p>LICENSE</p>
<blockquote>
<p>CocoaPods 强制要求所有的 Pods 依赖库都必须有 license 文件，否则验证不会通过。 license 文件有很多中，详情可以参考 tldrlegal。前面我们已经选择创建了一个 MIT 类型的 license。</p>
</blockquote>
<p>注意：打开隐藏目录，可以使用命令：</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-comment">//打开隐藏的命令:</span><br>defaults write com.apple.finder AppleShowAllFiles -bool <span class="hljs-literal">true</span><br><br><span class="hljs-comment">//关闭隐藏的命令:</span><br>defaults write com.apple.finder AppleShowAllFiles -bool <span class="hljs-literal">false</span><br><span class="hljs-string">``</span><span class="hljs-string">`  </span><br><span class="hljs-string"></span><br><span class="hljs-string">然后我们可以在gitlab也能看到对应的仓库  </span><br><span class="hljs-string"></span><br><span class="hljs-string">![](/xiwu_see/images/iOS/center_repository.jpeg)</span><br><span class="hljs-string"></span><br><span class="hljs-string">至此，整个spec center repository的创建就算全部完成了。</span><br><span class="hljs-string"></span><br><span class="hljs-string">-------</span><br><span class="hljs-string"></span><br><span class="hljs-string">### 私有库创建并将组件Spec 索引加入私有center repository  </span><br><span class="hljs-string"></span><br><span class="hljs-string"></span><br><span class="hljs-string">#### 1.首先创建一个文件夹SepcTest。  </span><br><span class="hljs-string"></span><br><span class="hljs-string"></span><br><span class="hljs-string">![](/xiwu_see/images/iOS/component_dir.jpeg)  </span><br><span class="hljs-string"></span><br><span class="hljs-string"></span><br><span class="hljs-string">#### 2.终端进入当前文件夹SepcTest，执行下列命令：  </span><br><span class="hljs-string"></span><br><span class="hljs-string">![](/xiwu_see/images/iOS/component_create.jpeg)  </span><br><span class="hljs-string"></span><br><span class="hljs-string">打开的项目结构如下：  </span><br><span class="hljs-string"></span><br><span class="hljs-string">![](/xiwu_see/images/iOS/component_replace.jpeg)  </span><br><span class="hljs-string"></span><br><span class="hljs-string">这里注意，在第1步不能直接create group形式加入文件，这样加入的文件在文件夹根目录下，而文件源码需要加入`</span>SpecTest——&gt;SpectTestView——&gt;SpectTestView——&gt;Classes<span class="hljs-string">`路径下,最后是需要执行pod update将开发模式的源码引用到项目中，执行完后会发现加入的组件代码已经加进去了，如下图：  </span><br><span class="hljs-string"></span><br><span class="hljs-string">![](/xiwu_see/images/iOS/component_originalcode.jpeg)  </span><br><span class="hljs-string"></span><br><span class="hljs-string">#### 3.编辑podspec文件信息  </span><br><span class="hljs-string"></span><br><span class="hljs-string">![](/xiwu_see/images/iOS/component_podspec.jpeg)</span><br><span class="hljs-string"></span><br><span class="hljs-string">&gt; 接下来讲解一下每行代码的含义  </span><br><span class="hljs-string">s.name：名称，pod search 搜索的关键词,注意这里一定要和.podspec的名称一样,否则报错  </span><br><span class="hljs-string">s.version：版本号  </span><br><span class="hljs-string">s.ios.deployment_target:支持的pod最低版本  </span><br><span class="hljs-string">s.summary: 简介  </span><br><span class="hljs-string">s.homepage:项目主页地址  </span><br><span class="hljs-string">s.social_media_url:社交网址,如果你写的是你自己的博客的话,你的podspec发布成功后会@你  </span><br><span class="hljs-string">s.license:许可证  </span><br><span class="hljs-string">s.author:作者  </span><br><span class="hljs-string">s.source:项目的地址  </span><br><span class="hljs-string">s.requires_arc: 是否支持ARC  </span><br><span class="hljs-string">s.source_files:需要包含的源文件  </span><br><span class="hljs-string">s.public_header_files:公开的头文件  </span><br><span class="hljs-string">//其他  </span><br><span class="hljs-string">s.resources: 资源文件  </span><br><span class="hljs-string">s.dependency：依赖库，不能依赖未发布的库，可以写多个依赖库  </span><br><span class="hljs-string">常见的写法：  </span><br><span class="hljs-string">1、dependency:写法  </span><br><span class="hljs-string">`</span><span class="hljs-string">``</span>javascript<br>s.dependency = <span class="hljs-string">&#x27;AFNetworking&#x27;</span> , <span class="hljs-string">&#x27;SDWebImage&#x27;</span><br></code></pre></td></tr></table></figure>
<p>2、source_files: 写法(按照自身的目录结构来，默认是第一种)</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-string">&#x27;SpectTestView/Classes/**/*&#x27;</span><br><span class="hljs-string">&#x27;SpectTestView/SpectTestView/*.&#123;h,m&#125;&#x27;</span><br><span class="hljs-string">&#x27;SpectTestView/**/*.h&#x27;</span><br></code></pre></td></tr></table></figure>
<figure class="highlight 1c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs 1c">&#x27;*&#x27;表示匹配所有文件<br>&#x27;*.&#123;h,m&#125;&#x27; 表示匹配所有以.h和.m结尾的文件<br>&#x27;**&#x27; 表示匹配所有子目录<br></code></pre></td></tr></table></figure>
<p>3、source: 常见写法</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><code class="hljs javascript">s.source = &#123; :<span class="hljs-function"><span class="hljs-params">git</span> =&gt;</span> <span class="hljs-string">&quot;https://git.rograndec.com/publicModule/SpectTestView.git&quot;</span>, :<span class="hljs-function"><span class="hljs-params">commit</span> =&gt;</span> <span class="hljs-string">&quot;68defea&quot;</span> &#125;<br>s.source = &#123; :<span class="hljs-function"><span class="hljs-params">git</span> =&gt;</span> <span class="hljs-string">&quot;https://git.rograndec.com/publicModule/SpectTestView.git&quot;</span>, :<span class="hljs-function"><span class="hljs-params">commit</span> =&gt;</span> <span class="hljs-string">&quot;68defea&quot;</span>, :<span class="hljs-function"><span class="hljs-params">tag</span> =&gt;</span> <span class="hljs-number">1.0</span><span class="hljs-number">.0</span> &#125;<br>s.source = &#123; :<span class="hljs-function"><span class="hljs-params">git</span> =&gt;</span> <span class="hljs-string">&quot;https://git.rograndec.com/publicModule/SpectTestView.git&quot;</span>, :<span class="hljs-function"><span class="hljs-params">tag</span> =&gt;</span> s.version &#125;<br></code></pre></td></tr></table></figure>
<p>commit =&gt; “68defea” 表示将这个Pod版本与Git仓库中某个commit绑定<br>tag =&gt; 1.0.0 表示将这个Pod版本与Git仓库中某个版本的comit绑定<br>tag =&gt; s.version 表示将这个Pod版本与Git仓库中相同版本的comit绑定。</p>
<h4 id="4-上传到git"><a href="#4-上传到git" class="headerlink" title="4.上传到git"></a>4.上传到git</h4><p>进入到当前项目根目录下(包含有.podspec文件),按照下列命令执行：</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-comment">/// 本地验证(详细编译信息与忽略警告)</span><br>pod lib lint SpectTestView.podspec --verbose --allow-warnings<br>git add .<br>git commit -m <span class="hljs-string">&quot;first commit&quot;</span><br>git remote add origin https:<span class="hljs-comment">//git.rograndec.com/publicModule/SpectTestView.git</span><br>git push -u origin master<br></code></pre></td></tr></table></figure>
<p>第一步是本地验证添加的podspec文件和本地组件源码格式，若无需编译信息和忽略警告，则后面可以不加<code>--verbose --allow-warnings</code><br>后面几步就是git的提交步骤了<br>这里注意在最后一步会出现<code>remote: Not Found fatal: repository &#39;https://git.rograndec.com/publicModule/SpectTestView.git/&#39; not found</code>，说明gitlab上没有对应的仓库，那么我们需要先到gitlab上去创建一个仓库(必须命名为SpectTestView对应)，选择public权限(便于公共使用),创建后如图所示：</p>
<p><img   class="lazyload" data-original="/xiwu_see/images/iOS/component_testSpecgit.jpeg" src="" ></p>
<p>然后重新命令行执行<code>git push -u origin master</code>就会将组件项目上传到创建的仓库里,如图所示：</p>
<p><img   class="lazyload" data-original="/xiwu_see/images/iOS/component_uploadExample.jpeg" src="" ></p>
<p>到这里我们已经完成私有组件库的创建上传。</p>
<h4 id="5-将spec索引发布到私有center-repository。"><a href="#5-将spec索引发布到私有center-repository。" class="headerlink" title="5.将spec索引发布到私有center repository。"></a>5.将spec索引发布到私有center repository。</h4><p>1.设置版本号，仍然在当前项目根目录下执行命令行：</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs javascript">git tag <span class="hljs-number">0.1</span><span class="hljs-number">.0</span> -m <span class="hljs-string">&quot;0.1.0版本&quot;</span><br>git push --tags<br></code></pre></td></tr></table></figure>
<p>2.验证文件， 本地与网络验证</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-comment">/// 1. 本地验证(详细编译信息与忽略警告)</span><br>pod lib lint --verbose --allow-warnings<br><span class="hljs-comment">/// 2. 网络验证</span><br>pod spec lint<br></code></pre></td></tr></table></figure>
<p>若上述命令都出现<code>SpectTestView passed validation</code>则表示验证通过则私有库版本创建成功完成，否则则需要重新修改配置或者代码，并且重点注意任何修改都必须进行版本升级，否则会出现同版本的指向不明给后面的引用带来问题。</p>
<p>3.将spec索引发布到私有center repository<br>命令行执行：</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs javascript">pod repo push RGPublicSpec SpectTestView.podspec<br></code></pre></td></tr></table></figure>
<p>完成后可以到gitlab上私有center repository看看出现下列图示表示发布私有仓库成功。</p>
<p><img   class="lazyload" data-original="/xiwu_see/images/iOS/component_addResponsitory.jpeg" src="" >  </p>
<hr>
<h3 id="私有库的pod引入"><a href="#私有库的pod引入" class="headerlink" title="私有库的pod引入"></a>私有库的pod引入</h3><p><img   class="lazyload" data-original="/xiwu_see/images/iOS/component_podimport.jpeg" src="" ></p>
<p>要将我们创建的私有库的源地址和Cocoapods本身的中央仓库源地址都加上，因为以前不写默认用Cocoapods本身的中央仓库源地址，但是加上我们自己的私有中央仓库有可能会覆盖掉默认的，导致引用的其他三方库出现找不到的情况。最后pod update一下，得到下面的图示：</p>
<p><img   class="lazyload" data-original="/xiwu_see/images/iOS/component_podOver.jpeg" src="" ></p>
<p>这里我们能看到私有库SpectTestView pod导入进来了，而且pod模式下会自动将其依赖库AFN也引入了，极其方便。这就是前面讲的为什么需要做剔除依赖的二进制，因为依赖在pod引入私有库的时候会自动引入，保证了代码的纯粹性和依赖库的解耦。</p>
<hr>
<h3 id="私有库的版本升级"><a href="#私有库的版本升级" class="headerlink" title="私有库的版本升级"></a>私有库的版本升级</h3><p>1.还原私有库的pod开发模式，主要是为了测试本地修改，如下图</p>
<p><img   class="lazyload" data-original="/xiwu_see/images/iOS/component_poddev.jpeg" src="" ></p>
<p>然后通过命令行cd进入私有库项目根目录，然后<code>cd Example</code>进入存在podfile文件的目录下执行<code>pod update</code>这样就还原了开发模式。</p>
<p>2.更改升级需要进行的源代码，并且修改podspec文件描述及版本</p>
<p><img   class="lazyload" data-original="/xiwu_see/images/iOS/component_versionupdate.jpeg" src="" ></p>
<p>3.退出到根目录，再执行上传git操作及将版本spec索引发布到私有center repository过程即可</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><code class="hljs javascript"><span class="hljs-comment">/// 本地验证(详细编译信息与忽略警告)</span><br>pod lib lint SpectTestView.podspec --verbose --allow-warnings<br>git add .<br>git commit -m <span class="hljs-string">&quot;修改版本&quot;</span><br>git push<br>git tag <span class="hljs-number">0.1</span><span class="hljs-number">.1</span> -m <span class="hljs-string">&quot;0.1.1版本&quot;</span><br>git push --tags<br>pod repo push RGPublicSpec SpectTestView.podspec<br></code></pre></td></tr></table></figure>
<p>最后得到私有仓库spec索引更新</p>
<p><img   class="lazyload" data-original="/xiwu_see/images/iOS/component_versionspec.jpeg" src="" ></p>
<p>4.在使用该私有库的项目中<code>pod update --verbose --no-repo-update</code>即可更新到最新版本，如果发现到最新版本，那可能是Cocoapods版本较低，需要升级。</p>
<hr>
<h3 id="私有库的源码与二进制码的切换"><a href="#私有库的源码与二进制码的切换" class="headerlink" title="私有库的源码与二进制码的切换"></a>私有库的源码与二进制码的切换</h3><p>1.切换目的<br>项目编译较慢，开发的时候为了加快效率当然需要以二进制码来进行，但是偶尔出现私有库版本需要做调试的情况或者说逻辑检测，这时候我们希望能看到源码，但是我们又不可能来来回回去替换文件，不仅操作不方便，而且极易造成文件缺失等问题，这里希望有一种方案能够通过pod直接来进行源码和二进制码的切换。</p>
<p>2.在当前私有库根目录下使用</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs javascript">pod packge SpectTestView.podspec --force<br></code></pre></td></tr></table></figure>
<p>进行二进制打包,最后效果如下</p>
<p><img   class="lazyload" data-original="/xiwu_see/images/iOS/component_package.jpeg" src="" ></p>
<p><img   class="lazyload" data-original="/xiwu_see/images/iOS/component_packagedir.jpeg" src="" ></p>
<p><img   class="lazyload" data-original="/xiwu_see/images/iOS/component_packageresult.jpeg" src="" ></p>
<p>最后需要的就是该framework文件</p>
<p>3.将打包生成的framework文件放入源码所在同一位置，这里我定义framework摆放位置<code>SpectTestView/Products/SpectTestView.framework</code>，注意这里的Products文件夹与<code>SpectTestView/Classes/**/*</code>中的classes位于同一层级,同时删除打包生成的根目录下文件夹<code>SpectTestView-0.1.1</code>，因为该文件已经没有作用了。</p>
<p>4.改写podSpec文件，定义的framework路径要与podSpec文件中设置的路径一致，同时加入IS_SOURCE和SpectTestView两个参数来判断切换。<br>当然源码和framwork代表的文件意义不一样，如图所示：</p>
<p><img   class="lazyload" data-original="/xiwu_see/images/iOS/component_vendor.jpeg" src="" ></p>
<p>说明：<br>1.因为存在修改，所以一定要升级。<br>2.ENV表示环境参数判断，后面会告知如何使用，这里意思是IS_SOURCE或者SpectTestView参数不为空的情况下，加载s.source_files的源码，否则加载s.vendored_frameworks的二进制码内容。为什么这里需要有两个参数判断，原因是前者是所有私有库统一切换的判断参数，后者是单独对应的私有库切换的判断参数。</p>
<p>5.升级版本操作，上传gitlab和发布spec(过程请看私有库的版本升级篇)</p>
<p>6.源码和二进制码的pod处理</p>
<p>首先在podfile文件中正常引入配置</p>
<p><img   class="lazyload" data-original="/xiwu_see/images/iOS/component_podimport.jpeg" src="" ></p>
<p>然后在podfile对应的根目录下执行</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs javascript">IS_SOURCE=<span class="hljs-number">1</span> pod update<br></code></pre></td></tr></table></figure>
<p>这一句在执行pod更新时将IS_SOURCE加入环境变量参数，按照第4步的说明应该是引入源码了，我们看看最终结果:</p>
<p><img   class="lazyload" data-original="/xiwu_see/images/iOS/component_podsource.jpeg" src="" ></p>
<p>可以看到与我们设计的基本是一致的，那么同理执行</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs javascript">SpectTestView=<span class="hljs-number">1</span> pod update<br></code></pre></td></tr></table></figure>
<p>引入的也是源码</p>
<p>最后我们直接执行，不带上任何环境变量,按照设计应该载入的是打包的二进制码</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><code class="hljs javascript">pod update<br></code></pre></td></tr></table></figure>
<p>得到的结果视图为：</p>
<p><img   class="lazyload" data-original="/xiwu_see/images/iOS/component_podsourcefail.jpeg" src="" ></p>
<p>出现这种原因是因为cocoapods的缓存，所以我们这里需要暴力处理，清除cocoapods的缓存，重新pod   update执行</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><code class="hljs javascript">sudo rm -fr ~<span class="hljs-regexp">/.cocoapods/</span>repos/RGPublicSpec/SpectTestView<br>pod cache clean SpectTestView<br></code></pre></td></tr></table></figure>
<p>最后的切换结果如图所示:</p>
<p><img   class="lazyload" data-original="/xiwu_see/images/iOS/component_podbinary.jpeg" src="" ></p>
<p>至此，关于私有库源码与二进制的切换则说明完成。</p>

      </section>
      <section class="extra">
        
          <ul class="copyright">
  
    <li><strong>本文作者：</strong>习武</li>
    <li><strong>本文链接：</strong><a href="https://gitee.com/xiwu123/xiwu_see.git/2019/07/05/iOS/pod%E7%BB%84%E4%BB%B6%E5%8C%96/index.html" title="https:&#x2F;&#x2F;gitee.com&#x2F;xiwu123&#x2F;xiwu_see.git&#x2F;2019&#x2F;07&#x2F;05&#x2F;iOS&#x2F;pod%E7%BB%84%E4%BB%B6%E5%8C%96&#x2F;index.html">https:&#x2F;&#x2F;gitee.com&#x2F;xiwu123&#x2F;xiwu_see.git&#x2F;2019&#x2F;07&#x2F;05&#x2F;iOS&#x2F;pod%E7%BB%84%E4%BB%B6%E5%8C%96&#x2F;index.html</a></li>
    <li><strong>版权声明：</strong>本博客所有文章均采用 <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh" title="BY-NC-SA" target="_blank" rel="noopener">BY-NC-SA</a> 许可协议，转载请注明出处！</li>
  
</ul>
        
        
        
  <ul class="tag-list" itemprop="keywords"><li class="tag-list-item"><a class="tag-list-link" href="/xiwu_see/tags/iOS-%E7%BB%84%E4%BB%B6%E5%8C%96/" rel="tag">iOS, 组件化</a></li></ul> 

        
  <nav class="nav">
    <a href="/xiwu_see/2019/07/31/iOS/%E7%BD%91%E7%BB%9C%E5%B1%82%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1/"><i class="iconfont iconleft"></i>网络架构设计</a>
    <a href="/xiwu_see/2019/06/26/iOS/%E7%BC%96%E8%AF%91%E4%BC%98%E5%8C%96/">编译优化<i class="iconfont iconright"></i></a>
  </nav>

      </section>
      
    </section>
  </div>
</article></div>
      <div class="col-xl-3">
        
          
  <aside class="toc-wrap">
    <h3 class="toc-title">文章目录：</h3>
    <ol class="toc"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E5%BC%95%E8%A8%80"><span class="toc-text">引言</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E7%9B%AE%E5%BD%95"><span class="toc-text">目录</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E7%A7%81%E6%9C%89spec-center-repository%E7%9A%84%E5%88%9B%E5%BB%BA"><span class="toc-text">私有spec center repository的创建</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E7%A7%81%E6%9C%89%E5%BA%93%E7%9A%84pod%E5%BC%95%E5%85%A5"><span class="toc-text">私有库的pod引入</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E7%A7%81%E6%9C%89%E5%BA%93%E7%9A%84%E7%89%88%E6%9C%AC%E5%8D%87%E7%BA%A7"><span class="toc-text">私有库的版本升级</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E7%A7%81%E6%9C%89%E5%BA%93%E7%9A%84%E6%BA%90%E7%A0%81%E4%B8%8E%E4%BA%8C%E8%BF%9B%E5%88%B6%E7%A0%81%E7%9A%84%E5%88%87%E6%8D%A2"><span class="toc-text">私有库的源码与二进制码的切换</span></a></li></ol>
  </aside>

        
      </div>
    </div>
  </div>
</main>
  

<footer class="footer">
  <div class="footer-social"><a 
        href="tencent://message/?Menu=yes&uin=756364924 "
        target="_blank"
        class="footer-social-item"
        onMouseOver="this.style.color= '#12B7F5'" 
        onMouseOut="this.style.color='#33333D'">
          <i class="iconfont  iconQQ "></i>
      </a><a 
        href="javascript:; "
        target="_blank"
        class="footer-social-item"
        onMouseOver="this.style.color= '#09BB07'" 
        onMouseOut="this.style.color='#33333D'">
          <i class="iconfont  iconwechat-fill "></i>
      </a><a 
        href="https://github.com/xiwuxisheng "
        target="_blank"
        class="footer-social-item"
        onMouseOver="this.style.color= '#9f7be1'" 
        onMouseOut="this.style.color='#33333D'">
          <i class="iconfont  icongithub-fill "></i>
      </a><a 
        href="756364924@qq.com "
        target="_blank"
        class="footer-social-item"
        onMouseOver="this.style.color=#FF3B00" 
        onMouseOut="this.style.color='#33333D'">
          <i class="iconfont  iconmail"></i>
      </a></div>
  
    <div class="footer-copyright"><p>Powered by <a target="_blank" href="https://hexo.io">习武</a>  |  Theme - <a target="_blank" href="https://xiwu123.gitee.io/xiwu_see">习武的个人博客</a></p></div>
  
</footer>
  
      <div class="fab fab-plus">
    <i class="iconfont iconplus"></i>
  </div>
  
  
  <div class="fab fab-up">
    <i class="iconfont iconcaret-up"></i>
  </div>
  
  
    <div class="scrollbar j-scrollbar">
  <div class="scrollbar-current j-scrollbar-current"></div>
</div>
  
  
    
<script src="/xiwu_see/js/color-mode.js"></script>

  
</body>

<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>



  
<script src="https://cdn.bootcdn.net/ajax/libs/jquery.lazyload/1.9.1/jquery.lazyload.min.js"></script>




  
<script src="https://cdnjs.cloudflare.com/ajax/libs/fancybox/3.5.7/jquery.fancybox.min.js"></script>








<script src="/xiwu_see/js/utils.js"></script>
<script src="/xiwu_see/js/script.js"></script>





  <script>
    (function () {
      var bp = document.createElement('script');
      var curProtocol = window.location.protocol.split(':')[0];
      if (curProtocol === 'https') {
        bp.src = 'https://zz.bdstatic.com/linksubmit/push.js';
      } else {
        bp.src = 'http://push.zhanzhang.baidu.com/push.js';
      }
      var s = document.getElementsByTagName("script")[0];
      s.parentNode.insertBefore(bp, s);
    })();
  </script>













</html>